﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;

namespace Chatter.CoreServer
{
    /// <summary>
    /// Classe qui permet la gestion des Logs de l'application
    /// </summary>
    public sealed class Logger
    {
        const string STRING_SEPARATOR = " | ";

        /// <summary>
        /// Ajoute à la suite du fichier de log
        /// </summary>
        /// <param name="logType">Type de log (Auth, Room, Admin)</param>
        /// <param name="stringToAppend">Contenu à ajouter à la suite du fichier</param>
        private static void _AppendToFile(LogType logType, string stringToAppend)
        {
            // Date et heure de l'évènement
            string date = DateTime.Now.ToShortDateString();
            string heure = DateTime.Now.ToLongTimeString();

            // Nom du fichier sous la forme "logs/jj-mm-yyyy.txt"
            string filename = "logs/" + logType.ToString() + "_" + date.Replace("/", "-") + ".txt";
            
            StringBuilder line = new StringBuilder();
            line.Append(date);
            line.Append(STRING_SEPARATOR);
            line.Append(heure);
            line.Append(STRING_SEPARATOR);
            line.Append(stringToAppend);

            TextWriter tw = new StreamWriter(filename, true);
            tw.WriteLine(line);
            tw.Close();
        }

        /// <summary>
        /// Ecrit une ligne dans le fichier de logs
        /// </summary>
        /// <param name="logType">Type de log (Auth, Room, Admin)</param>
        /// <param name="cmdType">Type de commande</param>
        /// <param name="senderName">Nom de l'émetteur de la commande</param>
        /// <param name="senderIP">Adresse IP de l'émetteur de la commande</param>
        /// <param name="text">Contenu à écrire dans le fichier</param>
        public static void WriteLine(LogType logType, CommandType cmdType, string senderName, IPAddress senderIP, string text = "")
        {
            StringBuilder line = new StringBuilder();
            line.Append(cmdType);
            line.Append(STRING_SEPARATOR);
            line.Append("FROM : " + senderName + "(" + senderIP + ")");
            if(!string.IsNullOrEmpty(text))
            {
                line.Append(STRING_SEPARATOR);
                line.Append(text);
            }
            Logger._AppendToFile(logType, line.ToString());
        }

        /// <summary>
        /// Ecrit une ligne dans le fichier de logs
        /// </summary>
        /// <param name="logType">Type de log (Auth, Room, Admin)</param>
        /// <param name="cmdType">Type de commande</param>
        /// <param name="senderIP">Adresse IP de l'émetteur de la commande</param>
        /// <param name="text">Contenu à écrire dans le fichier</param>
        public static void WriteLine(LogType logType, CommandType cmdType, IPAddress senderIP, string text)
        {
            StringBuilder line = new StringBuilder();
            line.Append(cmdType);
            line.Append(STRING_SEPARATOR);
            line.Append("FROM : " + senderIP);
            line.Append(STRING_SEPARATOR);
            line.Append(text);

            Logger._AppendToFile(logType, line.ToString());
        }

        /// <summary>
        /// Ecrit une ligne dans le fichier de logs
        /// </summary>
        /// <param name="logType">Type de log (Auth, Room, Admin)</param>
        /// <param name="cmdType">Type de commande</param>
        /// <param name="text">Contenu à écrire dans le fichier</param>
        public static void WriteLine(LogType logType, CommandType cmdType, string text)
        {

        }

        /// <summary>
        /// Ecrit une ligne dans le fichier de logs
        /// </summary>
        /// <param name="logType">Type de log (Auth, Room, Admin)</param>
        /// <param name="text">Contenu à écrire dans le fichier</param>
        public static void WriteLine(LogType logType, string text)
        {
            Logger._AppendToFile(logType, text);
        }
    }
}
